package com.sanyou.mapper;

import com.sanyou.pojo.Product;
import com.sanyou.pojo.dto.ProductInfoDTO;
import com.sanyou.pojo.dto.SimpleProductDTO;
import com.sanyou.pojo.vo.MaintainDataVo;
import com.sanyou.pojo.vo.ProductCountVo;
import com.sanyou.pojo.vo.ProductMaintainVo;
import com.sanyou.pojo.vo.ProductNumVo;
import com.sanyou.pojo.vo.ProductVo;
import com.sanyou.utils.MyMapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 封装阴极板信息相关的持久层交互接口
 */
public interface ProductMapper extends MyMapper<Product> {
    /**
     * 根据条件参数获取符合条件的阴极板信息列表
     * @param productCode 阴极板编码,模糊查询,为null时不作为条件
     * @param productState 阴极板状态,为null时不作为条件
     * @param maintainType 维修类型,为null时不作为条件
     * @param orderId 订单id,查询范围为该订单下所有阴极板,为null时不作为条件
     * @param projectId 项目id,查询范围为该项目下所有阴极板,为null时不作为条件
     * @param factoryId 工厂id,查询范围为该工厂下所有阴极板,为null时不作为条件
     * @param subFactoryId 车间id,查询范围为该车间下所有阴极板,为null时不作为条件
     * @param userid 用户id,查询范围为用户所具有数据查看权限的所有工厂和车间范围内的阴极板,为null时不作为条件
     * @return
     */
    List<ProductVo> listProductInfo(String productCode, Integer productState,Integer maintainType,Integer orderId,Integer projectId, String factoryId, String subFactoryId,String userid);

    List<ProductVo> getOrderProduct(Integer oid);

    int checkCodeRange(String startProductCode, String endProductCode);

//    List<ProductMaintainVo> query(ProductVo queryVo);



    //查询目标号码范围内所有未被分配的阴极板
    List<Product> queryWithUnassignedInRange(String startProductCode, String endProductCode);

    List<ProductNumVo> getFactoryAndProductCount();

    Integer getUncodeNumBySubFactoryId(String subFactoryId);

    List<ProductVo> queryAll();

    void updateProduct(Product product);

    /**
     * 根据项目id获取对应阴极板
     * @param projectId
     * @return
     */
    List<Product> getProjectProducts(@Param("pid") Integer projectId);

    ProductVo selectByCode(@Param("scanCode") String scanCode);

    List<Product> getExistList(String start, String end);

    ProductVo getProductCount(ProductVo queryVo);

    /**
     * 根据条件统计不同状态的阴极板的数量
     * @param productCode 阴极板编码(模糊查询),为null不做条件
     * @param productState 阴极板状态,为null不做条件
     * @param maintainType 维修类型,为null不做条件
     * @param factoryId 工厂id,为null不做条件
     * @param subFactoryId 车间id,为null不做条件
     * @param userid 用户id,查询用户拥有数据权限的范围内的数据,为null不做条件
     * @return
     */
    ProductCountVo getProductCount(String productCode, Integer productState,Integer maintainType, String factoryId, String subFactoryId,String userid);



    /**
     * 根据车间ID获取目标车间下所有状态的阴极板的数量统计
     * 报废板数和新增板数只计算本年度的数量
     * @param subFactoryId
     * @return
     */
    ProductCountVo getProductCountBySubFactoryId(String subFactoryId);


    /**
     *  获取废弃板数
     */
    Integer getScrapNum(String subFactoryId, Date startDate, Date endDate);

    /**
     * 获取新增板数
     */
    Integer getNewAddNum(String subFactoryId, Date startDate, Date endDate);
    /**
     * 获取所有超过阴极周期的在线阴极板
     */
    List<Product> selectUpdateProduct();

    /**
     * 获取处于维修状态下的阴极板的维修数据
     * @param maintainType 维修类型
     * @param productCode 阴极板编码
     * @param factoryId 工厂ID((搜索范围为工厂下所有车间对应的所有正在维修的阴极板))
     * @param subFactoryId 车间ID(搜索范围为车间对应的所有正在维修的阴极板)
     * @param userid 用户ID(userid非空且factoryId和subFactoryId为空时搜索范围为用户拥有数据查看权限的车间对应的所有正在维修的阴极板)
     * @return
     */
    List<MaintainDataVo> selectProductMaintainData(Integer maintainType, String productCode, String factoryId, String subFactoryId,String userid);

    /**
     * 获取项目获取下面的阴极板
     * @param projectId 项目Id
     * @return
     */
    List<SimpleProductDTO> queryByProjectId(String projectId );

    List<Product> listProductByCode(String productCode);
}
